package com.atguigu.greedy;

public class NQueens {
    public static void main(String[] args) {
        long start=System.currentTimeMillis();
        System.out.println(num1(16));
        long end=System.currentTimeMillis();
        System.out.println(end-start);
    }
    public static int num1(int n){
        if(n<1){
            return 0;
        }
        int[] record=new int[n];//record[i]表示i行的皇后放在了第几列
        return process1(0,record,n);
    }
    //目前来到了第i行
    //record[0,i-1]表示之前的行，放了皇后的位置
    //n代表整体一共有多少行
    //返回值是，摆完所有的皇后，合理的摆法有多少种
    public static int process1(int i,int[] record,int n){
        if(i==n){ //终止行
            return 1;
        }
        int res=0;
        for(int j=0;j<n;j++){
            //当前i行的皇后，放在j列，会不会和之前(0...i-1)的皇后，共行，共列或者共斜线
            if(isValid(record,i,j)){
                record[i]=j;
                res+=process1(i+1,record,n);
            }
        }
        return res;
    }
    public static boolean isValid(int[] record,int i,int j){
        for(int k=0;k<i;k++){ //之前的某个k行的皇后
            if(j==record[k]||Math.abs(record[k]-j)==Math.abs(i-k)){
                return false;
            }
        }
        return true;
    }
}
